`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/03/11 21:19:39
// Design Name: 
// Module Name: arp_top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module arp#(
   //开发板MAC地址 00-11-22-33-44-55
   parameter BOARD_MAC = 48'h00_11_22_33_44_55,  
   //开发板IP地址 192.168.1.10   
   parameter BOARD_IP = {8'd192,8'd168,8'd1,8'd10},
   //目的MAC地址 ff_ff_ff_ff_ff_ff 广播mac，在请求的时候发
   parameter  DES_MAC   = 48'hff_ff_ff_ff_ff_ff,
   //目的IP地址 192.168.1.102     
   parameter  DES_IP    = {8'd192,8'd168,8'd1,8'd102}
)(
    input           rst_n           ,
    input           gmii_rx_clk     ,
    input           gmii_rx_en      ,
    input  [7:0]    gmii_rx_data    ,
    input           key_req         , // 测试用
    output          arp_rx_done     ,
    output          arp_tx_done     ,
    output          arp_tx_busy     ,
    output          gmii_tx_en      ,
    output [7:0]    gmii_tx_data    ,
    output [31:0]   source_ip       ,
    output [47:0]   source_mac                    
    );

// wire define
wire [47:0] rx_mac;
wire [31:0] rx_ip;
// wire        rx_done;
wire        rx_type;
wire        gmii_tx_clk;
wire        tx_start;
wire [31:0] crc_data;
wire [31:0] crc_next;
wire        crc_clr;
wire        crc_en;
wire        tx_type;
/***********************************
                main code
***********************************/   
assign gmii_tx_clk = gmii_rx_clk;
assign source_ip = rx_ip;
assign source_mac = rx_mac;

arp_rx #(
    .BOARD_MAC  (BOARD_MAC),// 用于验证信息是否是发给我的
    .BOARD_IP   (BOARD_IP)
)u_arp_rx(
    // input
    .gmii_rx_clk    (gmii_rx_clk    ),
    .rst_n          (rst_n          ),
    .gmii_rx_en_i   (gmii_rx_en     ),
    .gmii_rx_data_i (gmii_rx_data   ),
    // output
    .des_mac        (rx_mac         ),
    .des_ip         (rx_ip          ),
    .rx_done        (arp_rx_done    ),
    .type           (rx_type        )
);

arp_tx #(
    .BOARD_MAC  (BOARD_MAC  ),
    .BOARD_IP   (BOARD_IP   ),
    .DES_MAC    (DES_MAC    ),
    .DES_IP     (DES_IP     )
)u_arp_tx(
    // input
    .clk            (gmii_tx_clk    ),
    .rst_n          (rst_n          ),
    .tx_start       (tx_start       ),
    .des_ip         (rx_ip          ),
    .des_mac        (rx_mac         ),
    .crc_data       (crc_data       ),
    .crc_next       (crc_next[31:24]),
    .type           (tx_type        ),
    // output
    .crc_clr        (crc_clr        ),
    .crc_en         (crc_en         ),
    .gmii_tx_en     (gmii_tx_en     ),
    .gmii_tx_data   (gmii_tx_data   ),
    .tx_done        (arp_tx_done    ),
    .arp_tx_busy    (arp_tx_busy    )
);

crc32_d8 u_arp_crc32_d8(
    .clk        (gmii_tx_clk    ),
    .rst_n      (rst_n          ),
    .data       (gmii_tx_data   ),
    .crc_en     (crc_en         ),
    .crc_clr    (crc_clr        ),

    .crc_data   (crc_data       ),
    .crc_next   (crc_next       )
);

arp_ctrl u_arp_ctrl(
    .clk            (gmii_rx_clk    ),
    .rst_n          (rst_n          ),
    .rx_done        (arp_rx_done    ),
    .rx_type        (rx_type        ),

    .tx_type        (tx_type        ),
    .tx_start       (tx_start       ),
    .key_req        (key_req        ) // 测试用
);
endmodule
